package com.ruoyi.health.report.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.google.gson.Gson;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AiResUserEntity;
import com.ruoyi.common.core.web.domain.AiResult;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.TableDataInfo;
import com.ruoyi.common.security.utils.DictUtils;
import com.ruoyi.common.security.utils.HttpUtils;
import com.ruoyi.customer.api.domain.ZkxcUser;
import com.ruoyi.customer.api.domain.ZkxcUserDTO;
import com.ruoyi.health.report.api.IRemoteSysConfigService;
import com.ruoyi.health.report.service.IHealthZkxcService;
import com.ruoyi.system.api.domain.SysDictData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
 * 健康分析
 *
 * @author ChenYF
 * @date 2025-08-29 9:50
 */
@RestController
@RequestMapping("/healthAnalysis")
public class HealthAnalysisController extends BaseController {

    @Autowired
    private IRemoteSysConfigService sysService;
    @Autowired
    private IHealthZkxcService zkxcService;

    /**
     * 获取报告数据
     * @param data
     * @return
     */
    @PostMapping("/analyse")
    public AjaxResult analyse(@RequestParam("data") String data) {
        // TODO: 校验是否已经生成过报告
        // 调用远程接口，获取报告数据
        String url = sysService.getConfigKey("ai.chat.path").getMsg() + "/chat";
        String model = sysService.getConfigKey("ai.chat.model").getMsg();
        String promptWord = sysService.getConfigKey("ai.chat.promptWord").getMsg();
        StringBuilder content = new StringBuilder(promptWord);

        // 传入传输转换为Map对象
        Map<String, String> inputJson = new Gson().fromJson(data, Map.class);
        // 获取字典，根据字典值 分析指标数据
        List<SysDictData> physiologicalIndicators = DictUtils.getDictCache("physiological_indicators");
        if (physiologicalIndicators != null) {
            physiologicalIndicators.forEach(item -> {
                String value = inputJson.get(item.getDictValue());
                // 获取指标名称
                if (!StringUtils.isEmpty(value)) {
                    content.append(",").append(item.getDictLabel()).append(value);
                }
            });
        }

        Map<String, String> message = new HashMap<>();
        message.put("role", "user");
        message.put("content", content.toString());

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("model", model);
        jsonObject.put("messages", Arrays.asList(message));

        String result = HttpUtils.sendPost(url, jsonObject.toJSONString());
        return AjaxResult.success(result);
    }

    @GetMapping("/getZkxcReport/{healthReportId}")
    public AjaxResult getZkxcReport(@PathVariable("healthReportId") Long healthReportId) {
        return zkxcService.getZkxcReport(healthReportId);
    }



    /**
     * 获取四诊仪用户列表
     *
     * @param channel  渠道号：1.Android  2.ios
     * @param reqTime  请求时间
     * @param mac      设备mac地址
     * @param name     用户姓名
     * @param idCard   身份证号码
     * @param pageNum  页码
     * @param pageSize 分页
     * @param status   状态：0：已登记 （已录入的用户） 1：已完成（完成采集的用户）
     * @return
     */
    @GetMapping(value = "/zkxc/getUserList")
    public AiResult getUserList(
            @RequestParam("channel") String channel,
            @RequestParam("reqTime") String reqTime,
            @RequestParam("mac") String mac,
            @RequestParam("name") String name,
            @RequestParam("idCard") String idCard,
            @RequestParam("pageNum") Integer pageNum,
            @RequestParam("pageSize") Integer pageSize,
            @RequestParam("status") Integer status
    ) {
        Gson gson = new Gson();
        // TODO: 接口安全性校验待补齐，初步预想为设置 mac白名单。
        // 参数设置
        ZkxcUserDTO dto = new ZkxcUserDTO();
        dto.setName(name);
        dto.setIdCard(idCard);
        dto.setStatus(status);
        dto.setPageNum(pageNum);
        dto.setPageSize(pageSize);
        // 远程调用用户模块查询用户信息
        startPage();
        TableDataInfo userList = sysService.getZkxcUserList(dto);
        // 返回值设置
        List<AiResUserEntity> resList = new ArrayList<>();
        for (Object item : userList.getRows()) {
            ZkxcUser user = gson.fromJson(gson.toJson(item), ZkxcUser.class);

            // 数据组装
            AiResUserEntity aiResUserEntity = new AiResUserEntity();
            aiResUserEntity.setPatientId(user.getId());
            aiResUserEntity.setName(user.getName());
            aiResUserEntity.setIdCard(user.getIdCard());
            aiResUserEntity.setPhone(user.getPhone());
            aiResUserEntity.setSex(user.getSex());
            aiResUserEntity.setAge(user.getAge());

            // 添加到返回值中
            resList.add(aiResUserEntity);
        }
        return AiResult.successPage(resList, userList.getTotal());
    }

    /**
     * 获取四诊仪推送的数据信息
     */
    @PostMapping("/zkxc/pushData")
    public AiResult pushData(@RequestPart(value = "pdfFile") List<MultipartFile> pdfFile, @RequestParam(value = "mPushDataEntity") String mPushDataEntity) {
        // TODO: 接口安全性校验待补齐，初步预想为设置 mac白名单。
        // 获取传输参数
        JSONObject jsonObject = JSON.parseObject(mPushDataEntity);
        // 数据保存并返回
        return zkxcService.insertZkxcPushData(jsonObject, pdfFile);
    }


    /**
     * 获取四诊仪推送的数据信息
     */
    @GetMapping("/getReportUrl/{id}")
    public AjaxResult getReportUrl(@PathVariable(value = "id") Long id) {
        // 数据保存并返回
        return AjaxResult.success("",zkxcService.getReportUrlByReportId(id));
    }
}
